﻿using System;

namespace ConsoleDemo.Polymorphism
{
    internal class AbstractDemo
    {
        internal static void Call()
        {
            VehicleBase car = new Car1();
            car.Run();                  // Car is running!
        }
    }


    //一个类里面一旦有了 abstract 成员，类就变成了抽象类，就必须标 abstract。
    //抽象类内部至少有一个函数成员未完全实现。
    abstract class Student
    {
        abstract public void Study();
    }

    //abstract 成员即暂未实现的成员，因为它必须在子类中被实现，所以抽象类不能是 private 的。

    //因为抽象类内部还有未实现的函数成员，计算机不知道怎么调用这类成员，于是编译器干脆不允许你实例化抽象类。

    //一个类不允许实例化，它就只剩两个用处了：
    //1. 作为基类，在派生类里面实现基类中的 abstract 成员
    //2. 声明基类（抽象类）类型变量去引用子类（已实现基类中的 abstract 成员）类型的实例，这又称为多态


    // 接口
    interface VehicleBase
    {
        void Stop();

        void Fill();

        void Run();
    }

    abstract class Vehicle1 : VehicleBase
    {
        public void Fill()
        {
            Console.WriteLine("Pay and fill...");
        }

        public void Stop()
        {
            Console.WriteLine("Stopped!");
        }

        abstract public void Run();
    }

    class Car1 : Vehicle1
    {
        public override void Run()
        {
            Console.WriteLine("Car is running...");
        }
    }
}
